#ifndef _ML307_BOARD_H_
#define _ML307_BOARD_H_

#include <stdio.h>
#include <config.h>
#include <stdlib.h>
#include <stdbool.h>

#if (_NETWOK_MODLE_TYPE_ == _ML307R_MODLE_) && (_NETWOK_FUNCTION_ENABLE_)

// MQTT 主题长度
#define ML307_MQTT_TOPIC_LENGTH                     (50ul)
// 最大接收数据长度
#define ML307_MAX_RECEIVE_DATA_LENGTH               NOMINAL_PACKET_LENGTH
// 设备 MAC 编码长度
#define ML307_DEVICE_MAC_ADDRESS_CODING_LENGTH      (MAC_ADDR_CODING_LENGTH)

// MQTT 用户名长度
#define ML307_MQTT_USER_NAME_LENGTH                 (NUMBER_OF_MQTT_USER_NAME_BIT)
// MQTT 密码长度
#define ML307_MQTT_PASSWORD_LENGTH                  (NUMBER_OF_MQTT_PASSWORD_BIT)
// MQTT 域名长度
#define ML307_MQTT_DOMAIN_NAME_LENGTH               (NUMBER_OF_SERVER_DOMIAN_NAME_BIT)

// DNS 服务器地址长度
#define ML307_SERVER_ADDRESS_LENGTH                 (NUMBER_OF_SERVER_IP_ADDRESS)
// 备用 DNS 服务器地址
#define ML307_DNS_ALTERNATIVE_IP_ADDRESS            ((uint8_t[]){114, 114, 114, 114})

/**
 * @brief 网络运营商
 *
 */
typedef enum
{
  ML307_CHINA_MOBILE,  // 中国移动
  ML307_CHINA_UNICOM,  // 中国联通
  ML307_CHINA_TELECOM, // 中国电信
} ML307NetworkOperator_t;

/**
 * @brief 毫秒延时
 *
 * @param Ms - 延时的时间
 */
extern void Ml307DelayMs(uint16_t Ms);

/**
 * @brief 获取网络服务商
 *
 * @return ML307NetworkOperator_t - 网络服务商
 */
extern ML307NetworkOperator_t Ml307GetNetworkOperator(void);

/**
 * @brief 获取设备推送主题
 *
 * @param pTopicOut - 订阅主题
 */
extern void Ml307GetMqttPublishTopic(char *pTopicOut);

/**
 * @brief 设置设备订阅主题
 *
 * @param pTopicOut - 订阅主题
 */
extern void Ml307GetMqttSubscribeTopic(char *pTopicOut);

/**
 * @brief 获取Mqtt登录服务器的密码
 *
 * @param pPasswordOut - 服务器的密码
 */
extern void Ml307GetMqttPassword(char *pPasswordOut);

/**
 * @brief 获取服务器地址
 *
 * @param pMaskAddrOut - 服务器地址
 */

extern void Ml307GetServerConnectAddress(uint8_t *pMaskAddrOut);

/**
 * @brief 获取 DNS 服务器地址
 * 
 * @param pMaskAddrOut - DNS 服务器地址
 */
extern void Ml307GetDnsServerAddress(uint8_t *pMaskAddrOut);

/**
 * @brief 获取服务器目标端口
 *
 * @return uint16_t - 目标端口
 */
extern uint16_t Ml307GetServerConnectPort(void);

/**
 * @brief 获取服务器域名地址
 *
 * @param pMaskAddrOut - 域名地址
 */
extern void Ml307GetNetworkDomianName(char *pMaskAddrOut);

/**
 * @brief 获取Mqtt服务器的用户名
 *
 * @param pUserNameOut - 用户名
 */
extern void Ml307GetMqttUserName(char *pUserNameOut);

/**
 * @brief 获取设备 mac 编码
 *
 * @param pMacAddrOut - 设备 mac 编码
 */
extern void Ml307GetDeviceMacAddress(uint8_t *pMacAddrOut);

/**
 * @brief 转发接收到的数据
 *
 * @param pMessagePacket - 接收的报文
 * @param MessageSize    - 报文数据长度
 */
extern void Ml307ForwardIncomingData(const uint8_t *pMessagePacket, uint16_t MessageSize);

#endif
#endif
